// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package sha1

import "internal/cpu"

// go:noescape 
func blockAVX2(dig *digest, p []byte)

// go:noescape 
func blockAMD64(dig *digest, p []byte)

var useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI1 && cpu.X86.HasBMI2

func block(dig *digest, p []byte) {
	if useAVX2 && len(p) >= 256 {
		// blockAVX2每次迭代计算2个块的sha1 
		// 它还交错下一个块的预计算。
		// 所以它可以读取超过p结尾的192字节
		// 我们可以在blockAVX2中添加检查，但这将
		// 只需将其转换为blockAMD64的副本，
		// 所以直接调用它即可。
		safeLen := len(p) - 128
		if safeLen%128 != 0 {
			safeLen -= 64
		}
		blockAVX2(dig, p[:safeLen])
		blockAMD64(dig, p[safeLen:])
	} else {
		blockAMD64(dig, p)
	}
}
